package com.hfb.mashibing.alip8.diamondsquarealgorithm.class10;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Code03_TopologySort {

    /**
     * directed graph and no loop（有向无环图）
     *
     */
    public static List<Node> sortedTopologySort(Graph graph) {

        // key:某一node
        // value: 剩余的入度
        HashMap<Node,Integer> inMap = new HashMap<>();

        // 剩余入度为0 的点，才能进这个队列
        Queue<Node> zeroInQueue = new LinkedList<>();
        for(Node node : graph.nodes.values()) {
            inMap.put(node, node.in);
            if (node.in == 0){
                zeroInQueue.add(node);
            }
        }
        // 拓扑排序的结果，依次加入result
        List<Node> result = new ArrayList<>();
        while (!zeroInQueue.isEmpty()){
            Node cur = zeroInQueue.poll();
            result.add(cur);
            for(Node next:cur.nexts){
                inMap.put(next, inMap.get(next)-1);
                if(inMap.get(next) == 0){
                    zeroInQueue.add(next);
                }
            }
        }
        return result;
    }

}
